﻿namespace Sofire.Data
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using System.Text;

    /// <summary>
    /// 表示以自定义数据集对象作为返回值的查询结果。
    /// </summary>
    /// <typeparam name="TDataSet">数据集的类型。</typeparam>
    public class DataSetResult<TDataSet> : CanUpdateQueryResultBase<TDataSet>
        where TDataSet : DataSet
    {
        #region Constructors

        /// <summary>
        /// 初始化 <see cref="Sofire.Data.DataSetResult&lt;TDataSet&gt;"/> 的新实例。
        /// </summary>
        internal DataSetResult()
        {
        }

        #endregion Constructors

        /// <summary>
        /// 获取一个值，表示值是否已被修改。
        /// </summary>
        public override bool IsChanged
        {
            get { return this._Value != null && this._Value.GetChanges() != null; }
        }

        #region Methods

        /// <summary>
        /// 执行释放任务。
        /// </summary>
        protected override void Disposing()
        {
            if(this._Value != null)
            {
                this._Value.Clear();
                this._Value.Dispose();
                this._Value = null;
            }
            base.Disposing();
        }

        /// <summary>
        /// 更新结果的返回值。
        /// </summary>
        /// <param name="dataAdapter">查询结果对应的数据适配器。</param>
        /// <returns>返回更新的行数。如果返回 0 则表示当前返回值并改动，如果返回小于 0 的整数，则表示更新发生了异常。</returns>
        protected override int UpdateValue(DbDataAdapter dataAdapter)
        {
            var changes = this._Value.GetChanges();
            var i = 0;
            if(changes != null)
            {
                i = dataAdapter.Update(changes);
                this._Value.AcceptChanges();
            }
            return i;
        }

        #endregion Methods
    }

    /// <summary>
    /// 表示以 <see cref="System.Data.DataSet"/> 对象作为返回值的查询结果。
    /// </summary>
    public class DataSetResult : DataSetResult<DataSet>
    {
        #region Constructors

        /// <summary>
        /// 初始化 <see cref="Sofire.Data.DataSetResult"/> 的新实例。
        /// </summary>
        /// <param name="dataSetResult"><see cref="Sofire.Data.DataSetResult&lt;TDataSet&gt;"/> 查询结果。</param>
        internal DataSetResult(DataSetResult<DataSet> dataSetResult)
        {
            this.Initialization(dataSetResult.QueryEngine, dataSetResult.Command, dataSetResult.Value, dataSetResult.Exception);
        }

        #endregion Constructors
    }
}